﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Init
{
    static class Comment
    {

        static public void DeleteComment(ref string Code)
        {
            #region MultiLine
            while (Code.IndexOf("/*") != -1)//コメントの開始が見つかる限り
            {
                int start = Code.IndexOf("/*");//削除開始位置


                #region Tips アルゴリズム

                //  /* /* /* */ */ */ こんなネストがあったとして
                //  1番目　= start に代入されて
                //  終了記号は3番目。
                //　よって　2 < 4 最初のwhileはtrue
                //  -1ではないのでbreakしないので、nest++して(nest = 1)、
                //  3番目から走査することになる。            
                //  次は3 < 4、true。
                //  nest++(nest = 2)。
                //  4番目から走査。
                //  4 < 4 == false よってbreak;
                //  nestは2であることがわかった。

                #endregion

                ///////////////////////////////
                //ネストの深度を測る

                int end = start + 2;//終了位置。+2は/*の字数分。
                int nest = 0;
                while (Code.IndexOf("/*", end) < Code.IndexOf("*/", end)) //ネストがある場合
                {
                    if (Code.IndexOf("/*", end) == -1) break;
                    end = Code.IndexOf("/*", end) + 2;//+2 = /*の字数分
                    nest++;
                }

                 #region debug
#if DEBUG
          
                Console.WriteLine("[DebugMessage::Comment::Delete::Nest]{0}", nest);
#endif
                 #endregion

                /////////////////////////////
                //開始点に対応した終了点を見つける
                int endPoint = end; //コメントの終了点
                while (Code.IndexOf("*/", endPoint) != -1)
                {
                    if (nest == 0)
                    {
                        endPoint = Code.IndexOf("*/", endPoint);
                        break;
                    }
                    else if (nest != 0)
                    {
                        nest--;
                        endPoint = Code.IndexOf("*/", endPoint) + 2;
                    }
                }
                if (nest != 0)//nestが0でなかったら。(対応点が見つからなかったら)
                {
                    throw new NotCommentEndException("コメントの終端を見つけられませんでした。");
                }

                /////////////////////////
                //切り取る

                string comp = "";

                endPoint += 2;//   */を飛ばす

                comp = Code.Substring(0, start);

                comp += Code.Substring(endPoint, Code.Length - endPoint);
                Code = comp;//適用




            }
            #endregion

            #region OneLine
            

            string[] Spl = Code.Split('\n');
            string tmp = "";//コード変数

            foreach (string exp in Spl)//行ごと
            {
                if (exp.IndexOf("//") != -1)//見つかれば
                {
                    int idx = exp.IndexOf("//");
                    tmp += exp.Substring(0, idx);//1 == //　の位置からずらすため。
                }
                else if (exp.IndexOf("//") == -1)
                {
                    tmp += (exp+"\n");//そのままパス
                }
            }
            Code = tmp;//適用

            #endregion

        }
    }
}
